package com.ys.可变字符串;

/**
 * 描述: StringBuffer 的基本应用:
 * StringBuffer 是可变字符串 底层没有用final 修饰 char[]
 *
 * @author CodeYang
 * @version 2020/12/22 18:02
 */
public class StringBuffer的基础应用 {

    public static void main(String[] args) {

    }


    /**
     * 构造方法
     */
    public static void method() {
        // 1.实例化一个初始容量为16个字符的可变字符串
        /**
         *  public StringBuffer() {
         *         super(16);
         *     }
         */
        StringBuffer sb1 = new StringBuffer();
        // 2.实例化一个指定字符容量的可变字符串
        StringBuffer sb2 = new StringBuffer(20);
        // 3.实例化一个指定字符串内容的可变字符串
        /**
         * public StringBuffer(String str) {
         *         super(str.length() + 16);
         *         append(str);
         *     }
         * */
        StringBuffer sb3 = new StringBuffer("hello world");
    }

    /**
     * 2 StringBuffer类常见方法
     * // 添加方法
     */
    // 添加方法
    public static void f1() {
        StringBuffer sb = new StringBuffer();
        sb.append("12");
        sb.append(1);
        sb.append(1.23);
        System.out.println(sb);//1211.23
    }

    //插入方法 insert
    public static void f2() {

        StringBuffer sb = new StringBuffer("hello word");
        sb.insert(5, "插入内容");
        System.out.println(sb); // hello插入内容 word
    }

    // 删除方法
    public static void f3() {
        //1范围删除 [start,end)  start < = end 否则报错
        StringBuffer sb = new StringBuffer("hello word");
        sb.delete(0, 6);
        System.out.println(sb);//word
        // 2 deleteCharAt 删除 可变字符串中 指定索引
        sb.deleteCharAt(0);
        System.out.println(sb);//ord
    }

    //修改方法
    public static void f4() {
        /**
         * replace(int start, int end, String str)方法，用字符串str替换从start开始到end-1截止的字符。
         * 注意start的取值范围是0到length()之间，并且end应该大于等于start，
         * 否则抛出StringIndexOutOfBoundsException异常。调用该方法以后，可变字符串的内容也发生改变。
         */
        // 创建一个可变字符容器，用来存放数据
        StringBuffer sb4 = new StringBuffer("hello world");
        // 字符串替换
        sb4.replace(5, 6, "我替换了空格");
        System.out.println(sb4); // 输出："hello我替换了空格world"
        /**
         * setCharAt(int index, char ch)方法，替换可变字符串中指定索引位置的字符。注意索引的取值范围是0到length() - 1之间，
         * 超出范围抛出StringIndexOutOfBoundsException异常。调用该方法以后，可变字符串的内容也发生改变。
         */
        // 创建一个可变字符容器，用来存放数据
        StringBuilder sb5 = new StringBuilder("hello-world");
        // 字符串替换
        sb5.setCharAt(5, '_');
        System.out.println(sb5); // 输出："hello_world"

    }

    /**
     * 逆序输出可变字符串 reverse方法
     */
    public static void f5() {
        // 创建一个可变字符容器，用来存放数据
        StringBuilder sb = new StringBuilder("hello world");
        // 将字符序列逆序，可变字符串中的内容随之也发生改变
        sb.reverse();
        System.out.println(sb); // 输出："dlrow olleh"
    }

    /**
     * 其他常用方法: 如分割字符串
     * StringBuffer类的其他常见方法，这些方法和String类中的方法和功能完全一致。
     * 和String类含义类似的方法摘要
     * length()	                    返回长度（字符数）。
     * substring(int start)	        返回一个新的 String ，其中包含此字符序列中当前包含的字符的子序列。
     *  其 start 的范围为[0,len-1]  - 并不会改变 原str 的内容
     * substring(int start, int end)	返回一个新的 String ，其中包含此序列中当前包含的字符的子序列。
     *   其 start 的范围为[0,len-1] end 范围 为[0,len-1] 且 start <= end - 并不会改变 原str 的内容
     * 否则: 报 StringIndexOutOfBoundsException
     */
    public static void f7() {
        StringBuffer sb = new StringBuffer("hellword");
        int length = sb.length();
        String substring = sb.substring(4);
        String substring1 = sb.substring(7, 4);
        System.out.println("length:" + length + "分割后的字符串1:从指定索引位置开始" + substring + "指定范围切割:" + substring1);
    }

    /**
     * setLength(int newLength)方法，用于设置字符序列的长度。
     * 注意newLength的取值必须大于或等于0，
     * 否则抛出IndexOutOfBoundsException异常。
     * 而且可以做切割字符
     */
    public static void f6() {
        // 创建一个可变字符容器，用来存放数据
        StringBuilder sb = new StringBuilder("hello-world");
        // 设置字符串长度
        sb.setLength(3);
        // 输出：内容："hel" length:3
        System.out.println("内容：" + sb + " length:" + sb.length());
    }


}
